#include "CommunicationManager.h"
#include <QDir>
#include <QPluginLoader>
#include <QDebug>

/**
 * @brief 获取通信管理器单例实例
 * @return 通信管理器实例的引用
 */
CommunicationManager &CommunicationManager::instance() {
    static CommunicationManager manager;
    return manager;
}

/**
 * @brief 私有构造函数（单例模式）
 * @param parent 父对象指针
 */
CommunicationManager::CommunicationManager(QObject *parent) : QObject(parent) {}

/**
 * @brief 析构函数（释放插件资源）
 */
CommunicationManager::~CommunicationManager() {
    // 释放插件加载器
    for (auto loader : m_pluginLoaders) {
        loader->unload();
        delete loader;
    }
    m_pluginLoaders.clear();
    // 释放通信模块（假设模块由插件管理，此处不主动删除）
}

/**
 * @brief 加载指定目录下的通信插件
 * @param pluginsDir 插件目录路径（如"../Plugins/Communication"）
 * @details 遍历目录下所有文件，使用QPluginLoader加载插件实例，验证为CommunicationInterface类型后注册到管理器
 */
void CommunicationManager::loadPlugins(const QString &pluginsDir) {
    QDir dir(pluginsDir);
    for (const QString &fileName : dir.entryList(QDir::Files)) {
        QPluginLoader *loader = new QPluginLoader(dir.filePath(fileName), this);
        QObject *plugin = loader->instance();
        if (plugin) {
            CommunicationInterface *comm = qobject_cast<CommunicationInterface *>(plugin);
            if (comm) {
                registerCommunication(comm);
                m_pluginLoaders.append(loader);
                qDebug() << "Loaded communication plugin: " << loader->fileName();
            } else {
                qWarning() << "Plugin is not a valid CommunicationInterface: " << loader->fileName();
                loader->unload();
                delete loader;
            }
        } else {
            qWarning() << "Failed to load plugin: " << loader->errorString();
            delete loader;
        }
    }
}

/**
 * @brief 注册通信模块实例到管理器
 * @param comm 实现了CommunicationInterface的通信模块实例
 * @details 根据模块类型（type()）将实例存入类型映射表，并绑定状态变更信号的槽函数
 */
void CommunicationManager::registerCommunication(CommunicationInterface *comm) {
    if (!comm) return;
    const QString type = comm->type();
    m_commMap[type].append(comm);
    connect(comm, &CommunicationInterface::statusChanged, this, [this, type](const QString &status) {
        qDebug() << "Communication " << type << " status changed to: " << status;
    });
    qDebug() << "Registered communication module: " << type;
}

/**
 * @brief 获取所有已注册的通信模块
 * @return 包含所有通信模块实例的列表
 * @details 遍历类型映射表，合并所有类型的模块实例
 */
QList<CommunicationInterface *> CommunicationManager::allCommunications() const {
    QList<CommunicationInterface *> list;
    for (const auto &commList : m_commMap) {
        list.append(commList);
    }
    return list;
}

/**
 * @brief 根据类型筛选通信模块
 * @param type 通信类型（如"SerialPort"/"Network"）
 * @return 匹配类型的通信模块列表（可能为空）
 */
QList<CommunicationInterface *> CommunicationManager::getCommunicationsByType(const QString &type) const {
    return m_commMap.value(type);
}

/**
 * @brief 向指定类型的所有通信模块发送数据
 * @param type 目标通信类型（如"SerialPort"）
 * @param data 待发送的字节数据
 * @return 至少一个模块发送成功返回true，否则返回false
 */
bool CommunicationManager::sendDataToType(const QString &type, const QByteArray &data) {
    bool success = false;
    for (auto comm : getCommunicationsByType(type)) {
        if (comm->sendData(data)) {
            success = true;
        }
    }
    return success;
}